﻿Imports System.Net
Imports System.Web
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Runtime.CompilerServices
Imports System.Runtime.Serialization.Json
Imports System.Net.Cache
Imports Sgml

Namespace Scraping
    ''' <summary>
    ''' WebスクレイピングでTwitterにアクセスします。
    ''' </summary>
    ''' <remarks>
    ''' 
    ''' </remarks>
    Partial Public Class TwitterClient
        Implements IDisposable
        Implements ITwitterClient

        Private Const StrThisInstanceIsNotLoginedYet As String = "This instance is not logined yet."
        Private Const StrAsyncThreadIsBusyNow As String = "Async thread is busy now."
        Private _cookies As New CookieContainer
        Private _authenticityToken As String
        Private _authenticityTokenFiledName As String

        Private Event OnInitialize As EventHandler
        Private Event OnFinalize As EventHandler

        Private _isLogined As Boolean
        ''' <summary>
        ''' Twitterにログインしているかを取得します。
        ''' </summary>
        ''' <returns>ログインしていればTrue,ログインしていなければFalse</returns>
        ''' <remarks>
        ''' このプロパティがFalseのときにLoginまたはBeginLogin以外のメソッドを呼び出そうとするとInvalidOperationExceptionがスローされます。
        ''' </remarks>
        Public ReadOnly Property IsLogined() As Boolean Implements ITwitterClient.IsLogined
            Get
                Return _isLogined
            End Get
        End Property

        Private _userName As String
        ''' <summary>
        ''' Twitterにログインしているユーザー名を取得します。
        ''' </summary>
        ''' <returns>ユーザー名</returns>
        ''' <remarks></remarks>
        Public ReadOnly Property UserName() As String Implements ITwitterClient.UserName
            Get
                Return _userName
            End Get
        End Property

        ''' <summary>
        ''' TwitterClientを初期化します。
        ''' </summary>
        ''' <remarks>
        ''' TwitterClientは、単一のアカウントのみログイン状態を保持できます。
        ''' 複数アカウントにログインする場合などは、それぞれで新しいインスタンスを初期化してください。
        ''' </remarks>
        Public Sub New()
            System.Net.ServicePointManager.Expect100Continue = False

            RaiseEvent OnInitialize(Me, EventArgs.Empty)
        End Sub

        Private _isDisposed As Boolean = False
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not _isDisposed Then
                If disposing Then
                    RaiseEvent OnFinalize(Me, EventArgs.Empty)
                End If
                Logout()
            End If
            _isDisposed = True
        End Sub

#Region " IDisposable Support "
        ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
        Public Sub Dispose() Implements IDisposable.Dispose
            ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class
End Namespace